package controle.percistencia;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import controle.excecao.IdExistenteException;
import controle.excecao.IdNaoEncontradoException;
import controle.excecao.NomeDeUsuarioInvalidoException;
import controle.interfacePercistencia.InterfacePercistenciaGenerica;

public abstract class PercistenciaGenerica<Dado, Id extends Serializable> implements InterfacePercistenciaGenerica<Dado, Id> {

	private List<Dado> repositorio;
	
	public PercistenciaGenerica() {
		
		repositorio = new ArrayList<Dado>();
	}
	
	@Override
	public void incluir(Dado novoDado) throws IdExistenteException{
		Id id;
		id = getId(novoDado);
		try {
			pesquisarDado(id);
			throw new IdExistenteException();
		} catch (IdNaoEncontradoException e) {
			repositorio.add(novoDado);
		}
		
		
	}

	@Override
	public void atualizar(Dado dadoAtualizado) throws IdNaoEncontradoException {
		Id id = getId(dadoAtualizado);
		Dado dado = pesquisarDado(id);
		dado = dadoAtualizado;
		
	}

	@Override
	public Dado pesquisarDado(Id id) throws IdNaoEncontradoException {
		Dado dado;
		Id idRep; 
		for (int i = 0; i < repositorio.size(); i++) {
			dado = (Dado)repositorio.get(i);
			idRep = getId(dado);
			if(idRep == id){
				return dado;
			}
		}
		throw new IdNaoEncontradoException();
	}

	protected abstract Id getId(Dado dado) ;

	@Override
	public List<Dado> listar() {
		return repositorio;
	}

	@Override
	public List<Dado> listarConsulta(String consulta) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void excluir(Id id) throws IdNaoEncontradoException {
		Dado dado = pesquisarDado(id);
		repositorio.remove(dado);
		
	}

}
